package priv.mill.util;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

import priv.mill.util.type.TypeValueFactory;

public enum MapUtil {
	INSTANCE;
	public void entity2Map(Object obj,Map<String,Object> map){
		
		Class<? extends Object> class1 = obj.getClass();
		if(class1.getName().startsWith("java"))return;
		if(class1.getName().startsWith("org"))return;
//		if(class1.isPrimitive()) 
		List<Method> methods=extrixGet(class1);
		for (Method method : methods) {
			try {
				Object object = method.invoke(obj);
				if(object==null) continue;
				if(method.getReturnType().isPrimitive()) {
					map.put(extrixPropertyName(method), object);
				}
//				else if(method.getReturnType().isArray()) {
//					map.put(extrixPropertyName(method), Arrays.asList(object));
//				}else if(object instanceof List){
//					map.put(extrixPropertyName(method), object);
//				}
				else if(!TypeValueFactory.handler(method,object,map)) {
					entity2Map(object,map);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

	private String extrixPropertyName(Method method) {
		if(method.getName().startsWith("is"))return method.getName().substring(2);
		return method.getName().substring(3);
	}

	/**
	 * 抽取所有的get方法
	 * @param class1
	 * @return
	 */
	private List<Method> extrixGet(Class<? extends Object> class1) {
		Method[] methods = class1.getMethods();
		List<Method> asList = Arrays.asList(methods);
		List<Method> r=new LinkedList<>();
		asList.forEach(t -> {
			if(getMethodFeatures(t)) {
				r.add(t);
			}
		});
		return r;
	}

	/**
	 * get方法的特征
	 * @param t
	 * @return
	 */
	private boolean getMethodFeatures(Method t) {
		return t.getParameterTypes().length==0 && t.getReturnType()!=void.class && t.getName().startsWith("get") || t.getName().startsWith("is");
	}
	
}
